package com.cqsd.ioc.trait;

import com.cqsd.ioc.core.context.BeanManager;

import java.util.Collection;
import java.util.Map;
import java.util.Optional;

/**
 * @author caseycheng
 * 用于管理Bean对象的创建
 * @date 2023/3/11-10:41
 **/
public interface BeanFactory extends Factory {
    /**
     * 通过BeanName获取一个Bean
     *
     * @param beanName
     * @return
     */
    Object getBean(String beanName);

    /**
     * 通过Class类型获取一个Bean
     *
     * @param type
     * @param <T>
     * @return
     */
    <T> T getBean(Class<T> type);

    /**
     * 通过BeanName和Class类型获取一个Bean
     *
     * @param beanName
     * @param type
     * @param <T>
     * @return
     */
    <T> T getBean(String beanName, Class<T> type);

    /**
     * 通过BeanInfo创建一个Bean
     *
     * @param type
     * @param <T>
     * @return
     */
    <T> T createBean(BeanInfo type);

    /**
     * 查找Bean定义
     *
     * @return
     */
    Optional<? extends BeanInfo> searchBeanDef(Class<?> type);

    /**
     * 将自己解析的bean交给容器管理
     */
    void registerBean(BeanInfo beanInfo) throws NullPointerException;
    /**
     * 将解析的bean集合交给容器管理
     */
    void registerBeans(Collection<BeanInfo> beanInfoCollection);

    /**
     * 获取被子类管理的Bean信息池
     *
     * @return
     */
    Map<String, BeanInfo> getBeanInfoMap();

    /**
     * 获取单例池
     *
     * @return
     */
    BeanManager.SingleObjects getSingleObjects();

    /**
     * 获取beanInfo容器
     * @return
     */
    BeanManager getBeanInfoManager();

}
